home *** CD-ROM | disk | FTP | other *** search
/ ARRL Handbook 2008 12.0 / arrl_handbook_2008_cd.bin / program files / ARRL 2008 Handbook / Software / DOS Software / Chap 16 - dsp / FSQRT.TXT < prev    next >
Encoding:
Text File  |  2002-04-24  |  6.3 KB  |  327 lines

  1. fsqrt:
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ; Entry conditions: 32-bit argument in AM ;
  4. ;   register.                             ;
  5. ; Exit conditions: 16-bit square root in  ;
  6. ;   d register.                           ;
  7. ; Modified: D, E, X, Y                    ;
  8. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  9.  
  10.       ldy  #0000     ;start with 0 count
  11.       tmxed          ;arg in x:e:d
  12.       xgde           ;lsw in e, msw in d
  13.       tsta           ;msb=0?
  14.       beq  fazero    ;yes, normalize
  15.       aiy  #$01      ;1 shift more
  16.       lsrd           ;divide by 2
  17.       rore           ;
  18.       lsrd           ;next divide by 2
  19.       bita #$ff      ;done?
  20.       beq  fdzero    ;yes
  21.       rore           ;finish divide
  22.       aiy  #$01      ;1 shift more
  23.       lsrd           ;divide by 2 again
  24.       rore           ;
  25.       lsrd           ;next divide by 2
  26.       bita #$ff      ;done?
  27.       beq  fdzero    ;yes
  28.       rore           ;finish divide
  29.       aiy  #$01      ;1 shift more
  30.       lsrd           ;divide by 2
  31.       rore           ;
  32.       lsrd           ;next divide by 2
  33.                      ;
  34. fdzero: rore         ;normalized argument in d:e
  35.       asld           ;;;mult by 2 for table address
  36.       ldx  #roottabl+2 ;base address of root table
  37.       adx            ;;;add offset
  38.       ldd  0,x       ;get nearest root from table
  39.       subd -2,x      ;minus the lower root
  40.       lsre           ;make the remainder a signed fraction
  41.       fmuls          ;b*(xa+1-xa)
  42.       adce -2,x      ;b*(xa+1-xa)+xa
  43.       xgdy           ;# of shifts, k, in d
  44.       addd #-4       ;d-4 in d
  45.       negd           ;4-d in d
  46.       beq  fddone    ;this is 0
  47.       lsre           ;denormalize the result
  48.       addd #-1       ;next
  49.       beq  fddone    ;
  50.       lsre           ;shift back
  51.       addd #-1       ;next
  52.       beq  fddone    ;
  53.       lsre           ;shift back
  54.                      ;
  55. fddone: xgde         ;result in d
  56.       rts            ;out
  57.                      ;
  58. fazero: cmpb #$3f    ;done normalizing?
  59.       bhi  fadz      ;yes, k=0
  60.       aiy  #$01      ;one shift more
  61.       asle           ;divide by 2
  62.       rold           ;
  63.       asle           ;divide by 2 again
  64.       rold           ;done
  65.       cmpb #$3f      ;done normalizing?
  66.       bhi  fadz      ;yes, k=2
  67.       aiy  #$01      ;one shift more
  68.       asle           ;divide by 2
  69.       rold           ;
  70.       asle           ;and again
  71.       rold           ;done
  72.       cmpb #$3f      ;done?
  73.       bhi  fadz      ;yes, k=4
  74.       aiy  #$01      ;one shift more
  75.       asle           ;divide by 2
  76.       rold           ;
  77.       asle           ;and again
  78.       rold           ;done, k=6
  79.                      ;
  80. fadz:  asld          ;;;mult by 2 to be table address
  81.       ldx  #roottabl+2 ;table base address
  82.       adx            ;;;add offset
  83.       ldd  0,x       ;get table word
  84.       subd -2,x      ;(xa+1-xa)
  85.       lsre           ;make remainder a signed fraction
  86.       fmuls          ;b*(xa+1-xa)
  87.       adce -2,x      ;b*(xa+1-xa)+xa
  88.       lsre           ;divide by 16 right off, since arg<224
  89.       lsre           ;
  90.       lsre           ;
  91.       lsre           ;OK
  92.       xgdy           ;# of shifts, k, in d
  93.       tstd           ;=0?
  94.       beq  fazone    ;done
  95.       lsre           ;denormalize the result, divide by 2
  96.       addd #-1       ;next
  97.       beq  fazone    ;done
  98.       lsre           ;divide by 2
  99.       addd #-1       ;next
  100.       beq  fazone    ;done
  101.       lsre           ;divide by 2
  102.                      ;
  103. fazone: xgde         ;result in d
  104.       rts            ;out
  105.  
  106.  roottabl:
  107.  dc.w $0
  108.  dc.w $1000
  109.  dc.w $16A1
  110.  dc.w $1BB6
  111.  dc.w $2000
  112.  dc.w $23C7
  113.  dc.w $2731
  114.  dc.w $2A55
  115.  dc.w $2D41
  116.  dc.w $3000
  117.  dc.w $3299
  118.  dc.w $3511
  119.  dc.w $376D
  120.  dc.w $39B0
  121.  dc.w $3BDE
  122.  dc.w $3DF8
  123.  dc.w $4000
  124.  dc.w $41F8
  125.  dc.w $43E2
  126.  dc.w $45BE
  127.  dc.w $478E
  128.  dc.w $4952
  129.  dc.w $4B0C
  130.  dc.w $4CBC
  131.  dc.w $4E62
  132.  dc.w $5000
  133.  dc.w $5196
  134.  dc.w $5323
  135.  dc.w $54AA
  136.  dc.w $562A
  137.  dc.w $57A3
  138.  dc.w $5916
  139.  dc.w $5A82
  140.  dc.w $5BEA
  141.  dc.w $5D4C
  142.  dc.w $5EA8
  143.  dc.w $6000
  144.  dc.w $6153
  145.  dc.w $62A1
  146.  dc.w $63EC
  147.  dc.w $6531
  148.  dc.w $6673
  149.  dc.w $67B1
  150.  dc.w $68EB
  151.  dc.w $6A22
  152.  dc.w $6B55
  153.  dc.w $6C84
  154.  dc.w $6DB1
  155.  dc.w $6EDA
  156.  dc.w $7000
  157.  dc.w $7123
  158.  dc.w $7243
  159.  dc.w $7361
  160.  dc.w $747B
  161.  dc.w $7593
  162.  dc.w $76A9
  163.  dc.w $77BC
  164.  dc.w $78CC
  165.  dc.w $79DA
  166.  dc.w $7AE6
  167.  dc.w $7BEF
  168.  dc.w $7CF7
  169.  dc.w $7DFC
  170.  dc.w $7EFF
  171.  dc.w $8000
  172.  dc.w $80FF
  173.  dc.w $81FC
  174.  dc.w $82F7
  175.  dc.w $83F0
  176.  dc.w $84E8
  177.  dc.w $85DE
  178.  dc.w $86D2
  179.  dc.w $87C4
  180.  dc.w $88B4
  181.  dc.w $89A3
  182.  dc.w $8A90
  183.  dc.w $8B7C
  184.  dc.w $8C66
  185.  dc.w $8D4F
  186.  dc.w $8E36
  187.  dc.w $8F1C
  188.  dc.w $9000
  189.  dc.w $90E3
  190.  dc.w $91C4
  191.  dc.w $92A4
  192.  dc.w $9383
  193.  dc.w $9461
  194.  dc.w $953D
  195.  dc.w $9618
  196.  dc.w $96F2
  197.  dc.w $97CA
  198.  dc.w $98A1
  199.  dc.w $9977
  200.  dc.w $9A4C
  201.  dc.w $9B20
  202.  dc.w $9BF3
  203.  dc.w $9CC4
  204.  dc.w $9D95
  205.  dc.w $9E64
  206.  dc.w $9F33
  207.  dc.w $A000
  208.  dc.w $A0CC
  209.  dc.w $A198
  210.  dc.w $A262
  211.  dc.w $A32B
  212.  dc.w $A3F4
  213.  dc.w $A4BB
  214.  dc.w $A581
  215.  dc.w $A647
  216.  dc.w $A70B
  217.  dc.w $A7CF
  218.  dc.w $A892
  219.  dc.w $A954
  220.  dc.w $AA15
  221.  dc.w $AAD5
  222.  dc.w $AB95
  223.  dc.w $AC53
  224.  dc.w $AD11
  225.  dc.w $ADCE
  226.  dc.w $AE8A
  227.  dc.w $AF45
  228.  dc.w $B000
  229.  dc.w $B0BA
  230.  dc.w $B173
  231.  dc.w $B22B
  232.  dc.w $B2E3
  233.  dc.w $B399
  234.  dc.w $B450
  235.  dc.w $B505
  236.  dc.w $B5BA
  237.  dc.w $B66E
  238.  dc.w $B721
  239.  dc.w $B7D3
  240.  dc.w $B885
  241.  dc.w $B937
  242.  dc.w $B9E7
  243.  dc.w $BA97
  244.  dc.w $BB46
  245.  dc.w $BBF5
  246.  dc.w $BCA3
  247.  dc.w $BD51
  248.  dc.w $BDFD
  249.  dc.w $BEA9
  250.  dc.w $BF55
  251.  dc.w $C000
  252.  dc.w $C0AA
  253.  dc.w $C154
  254.  dc.w $C1FD
  255.  dc.w $C2A6
  256.  dc.w $C34E
  257.  dc.w $C3F6
  258.  dc.w $C49C
  259.  dc.w $C543
  260.  dc.w $C5E9
  261.  dc.w $C68E
  262.  dc.w $C733
  263.  dc.w $C7D7
  264.  dc.w $C87B
  265.  dc.w $C91E
  266.  dc.w $C9C1
  267.  dc.w $CA63
  268.  dc.w $CB04
  269.  dc.w $CBA6
  270.  dc.w $CC46
  271.  dc.w $CCE6
  272.  dc.w $CD86
  273.  dc.w $CE25
  274.  dc.w $CEC4
  275.  dc.w $CF62
  276.  dc.w $D000
  277.  dc.w $D09D
  278.  dc.w $D13A
  279.  dc.w $D1D7
  280.  dc.w $D272
  281.  dc.w $D30E
  282.  dc.w $D3A9
  283.  dc.w $D444
  284.  dc.w $D4DE
  285.  dc.w $D577
  286.  dc.w $D611
  287.  dc.w $D6AA
  288.  dc.w $D742
  289.  dc.w $D7DA
  290.  dc.w $D872
  291.  dc.w $D909
  292.  dc.w $D9A0
  293.  dc.w $DA36
  294.  dc.w $DACC
  295.  dc.w $DB62
  296.  dc.w $DBF7
  297.  dc.w $DC8B
  298.  dc.w $DD20
  299.  dc.w $DDB4
  300.  dc.w $DE47
  301.  dc.w $DEDB
  302.  dc.w $DF6E
  303.  dc.w $E000
  304.  dc.w $E092
  305.  dc.w $E124
  306.  dc.w $E1B5
  307.  dc.w $E246
  308.  dc.w $E2D7
  309.  dc.w $E367
  310.  dc.w $E3F7
  311.  dc.w $E487
  312.  dc.w $E516
  313.  dc.w $E5A5
  314.  dc.w $E633
  315.  dc.w $E6C1
  316.  dc.w $E74F
  317.  dc.w $E7DD
  318.  dc.w $E86A
  319.  dc.w $E8F7
  320.  dc.w $E983
  321.  dc.w $EA0F
  322.  dc.w $EA9B
  323.  dc.w $EB27
  324.  dc.w $EBB2
  325.  dc.w $EC3D
  326.  
  327.